package com.luych.toolbox.data.service.core.mysql;

import com.luych.toolbox.common.enums.DataSourceType;
import com.luych.toolbox.data.service.core.CoreDataType;

public enum  MysqlDataType implements CoreDataType {

    BOOL(false, false, false), // TINYINT(1)的别名
    BOOLEAN(false, false, false), // TINYINT(1)的别名

    BIT(false, true, false), // M范围1-64，存储二进制数据

    TINYINT(false, true, false), // 1字节（-128~127 或 0~255）
    SMALLINT(false, false, false), // 2字节（-32,768~32,767 或 0~65,535）
    MEDIUMINT(false, false, false), // 3字节（-8,388,608~8,388,607 或 0~16,777,215）
    INT(false, false, false), // 4字节（±2.1亿 或 0~42亿）
    INTEGER(false, false, false), // 4字节（±2.1亿 或 0~42亿）
    BIGINT(false, false, false), // 8字节（±9.22×10¹⁸ 或 0~1.84×10¹⁹）

    FLOAT(false, true, true), // 4字节单精度浮点数
    DOUBLE(false, true, true), // 8字节双精度浮点数
    DEC(false, true, true), // 精确小数，M是总位数(1-65)，D是小数位数(0-30)
    DECIMAL(false, true, true), // 精确小数，M是总位数(1-65)，D是小数位数(0-30)
    NUMERIC(false, true, true), // 精确小数，M是总位数(1-65)，D是小数位数(0-30)

    CHAR(true, false, false), // 固定长度字符串，M范围0-255
    VARCHAR(true, false, false), // 可变长度字符串，M范围0-65,535

    BINARY(false, true, false), // 固定长度二进制字符串
    VARBINARY(false, true, false), // 可变长度二进制字符串

    YEAR(false, false, false), // 年份，2位或4位格式
    DATE(false, false, false), // 日期，格式'YYYY-MM-DD'
    TIME(false, false, false), // 时间，格式'HH:MM:SS'
    DATETIME(false, false, false), // 日期时间，格式'YYYY-MM-DD HH:MM:SS'
    TIMESTAMP(false, false, false), // 时间戳，范围1970-2038年

    TINYTEXT(false, false, false), // 最大长度2^8-1=255个字节 255B
    TEXT(false, false, false), // 最大长度2^16-1=65535个字节 64K
    MEDIUMTEXT(false, false, false), // 最大长度2^24-1=16777215个字节 16M
    LONGTEXT(false, false, false), // 最大长度2^32-1=4294967295个字节 4G
    JSON(false, false, false), // 最大长度2^32-1=4294967295个字节 4G

    TINYBLOB(false, false, false), // 最大长度2^8-1=255个字节 255B
    BLOB(false, false, false), // 最大长度2^16-1=65535个字节 64K
    MEDIUMBLOB(false, false, false), // 最大长度2^24-1=16777215个字节 16M
    LONGBLOB(false, false, false), // 最大长度2^32-1=4294967295个字节 4G

    ENUM(false, false, false), // 枚举类型，从预定义列表中选择一个值
    SET(false, false, false), // 集合类型，从预定义列表中选择多个值

    ;

    private final boolean supportCharLength;
    private final boolean supportNumericPrecision;
    private final boolean supportNumericScale;

    MysqlDataType(boolean supportCharLength, boolean supportNumericPrecision, boolean supportNumericScale) {
        this.supportCharLength = supportCharLength;
        this.supportNumericPrecision = supportNumericPrecision;
        this.supportNumericScale = supportNumericScale;
    }


    @Override
    public DataSourceType getDataSourceType() {
        return DataSourceType.MYSQL;
    }

    @Override
    public String getName() {
        return this.name();
    }

    @Override
    public boolean supportCharLength() {
        return this.supportCharLength;
    }

    @Override
    public boolean supportNumericPrecision() {
        return this.supportNumericPrecision;
    }

    @Override
    public boolean supportNumericScale() {
        return this.supportNumericScale;
    }
}
